package com.librelato.tela;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;

import com.librelato.bean.CompradorBean;
import com.librelato.bean.EmpresaBean;
import com.librelato.bean.PedidoBean;
import com.librelato.bean.ProdutoBean;
import com.librelato.bean.SolicitacaoBean;
import com.librelato.bean.UsuarioBean;
import com.librelato.negocio.CompradorServico;
import com.librelato.negocio.PedidoServico;
import com.librelato.negocio.SolicitacaoServico;
import com.librelato.negocio.interfaces.IServicoGenerico;
import com.librelato.tela.datamodel.ProdutoDataModel;

@ManagedBean
@ViewScoped
public class AprovaSolicitacaoTela extends TelaAbstrata {

	@ManagedProperty(value = "#{usuario}")
	private UsuarioBean usuario;

	private PedidoServico<PedidoBean> pedidoServico;

	private SolicitacaoServico<SolicitacaoBean> solicitacaoServico;

	private List<SolicitacaoBean> listaSolicitacao;

	private ProdutoDataModel itensSolicitacao;

	private SolicitacaoBean solicitacao;

	private EmpresaBean empresa;

	private String dataDe;

	private String dataAte;

	private String numSolicitacao;

	private String codProd;

	private String filial;

	private Map<String, String> parametros;

	private ProdutoBean[] itensSelecionados;

	private List<ProdutoBean> itensRejeicao;

	private List<CompradorBean> compradores;

	private String compradorDestino;

	private CompradorServico<CompradorBean> compradorServico;

	public AprovaSolicitacaoTela() {
		usuario = usuario == null ? (UsuarioBean) ((HttpSession) FacesContext
				.getCurrentInstance().getExternalContext().getSession(false))
				.getAttribute("usuario") : usuario;
		pedidoServico = new PedidoServico<PedidoBean>();
		solicitacaoServico = new SolicitacaoServico<SolicitacaoBean>();
		itensRejeicao = new ArrayList<ProdutoBean>();
		compradorServico = new CompradorServico<CompradorBean>();
	}

	public void buscaSolicitacaoComprador() {
		try {

			parametros = new HashMap<String, String>();
			if (dataDe != null && !"".equals(dataDe.trim())) {
				parametros.put("DATADE", dataDe);
			}
			if (dataAte != null && !"".equals(dataAte.trim())) {
				parametros.put("DATAATE", dataAte);
			}
			if (codProd != null && !"".equals(codProd.trim())) {
				parametros.put("PRODUTO", codProd);
			}
			if (numSolicitacao != null && !"".equals(numSolicitacao.trim())) {
				parametros.put("NUMSOL", numSolicitacao);
			}
			if (filial != null && !"".equals(filial.trim())) {
				parametros.put("FILIAL", filial);
			}

			listaSolicitacao = this.solicitacaoServico
					.buscaSolicitacaoComprador("Bloqueado", usuario, parametros);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public String pintaLinhaBusca(String produto) {
		String corLinha = "";
		if (codProd != null && !"".equals(codProd.trim())
				&& codProd.trim().equals(produto.trim())) {
			corLinha = "LinhaBusca";
		}
		return corLinha;
	}

	public void preencheListModel(SolicitacaoBean solicitacao) {
		this.solicitacao = solicitacao;
		itensSolicitacao = new ProdutoDataModel(
				this.solicitacao.getItensSolicitacao());
	}

	public void liberaSolicitacao() {
		try {
			if (itensSelecionados.length > 0) {
				solicitacao.setItensSolicitacao(Arrays
						.asList(itensSelecionados));
				solicitacao.setComprador(usuario.getComprador());
				this.solicitacaoServico.liberaSolicitacao(solicitacao);
				for (int i = 0; i < solicitacao.getItensSolicitacao().size(); i++) {
					solicitacao.getItensSolicitacao().get(i).setObservacao("");
				}
				this.solicitacaoServico
						.insereHistorico(solicitacao, "Solicitação Liberada");
				FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
						this.solicitacaoServico.getValor("msg_header_sucesso"),
						this.solicitacaoServico.getValor("msg_libera_solicita"));
				FacesContext.getCurrentInstance().addMessage(null, msg);
				buscaSolicitacaoComprador();
				itensSelecionados = null;
			} else {
				FacesMessage msg = new FacesMessage(
						FacesMessage.SEVERITY_ERROR,
						this.solicitacaoServico.getValor("msg_header_erro"),
						this.solicitacaoServico.getValor("msg_erro_item"));
				FacesContext.getCurrentInstance().addMessage(null, msg);
			}
		} catch (Exception e) {
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					this.solicitacaoServico.getValor("msg_header_erro"),
					this.solicitacaoServico
							.getValor("msg_libera_solicita_erro"));
			FacesContext.getCurrentInstance().addMessage(null, msg);
			e.printStackTrace();
		}
	}
	
	public void rejeitaSolicitacao() {
		try {
			if (itensRejeicao.size() > 0) {
				solicitacao.setItensSolicitacao(itensRejeicao);
				solicitacao.setComprador(usuario.getComprador());
				this.solicitacaoServico.rejeitaSolicitacao(solicitacao);
				this.solicitacaoServico.insereHistorico(solicitacao,
						"Solicitação Rejeitada");
				FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
						this.solicitacaoServico.getValor("msg_header_sucesso"),
						this.solicitacaoServico
								.getValor("msg_rejeita_solicita"));
				FacesContext.getCurrentInstance().addMessage(null, msg);
				buscaSolicitacaoComprador();
				itensSelecionados = null;
			} else {
				FacesMessage msg = new FacesMessage(
						FacesMessage.SEVERITY_ERROR,
						this.solicitacaoServico.getValor("msg_header_erro"),
						this.solicitacaoServico.getValor("msg_erro_item"));
				FacesContext.getCurrentInstance().addMessage(null, msg);
			}
		} catch (Exception e) {
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					this.solicitacaoServico.getValor("msg_header_erro"),
					this.solicitacaoServico
							.getValor("msg_rejeita_solicita_erro"));
			FacesContext.getCurrentInstance().addMessage(null, msg);
			e.printStackTrace();
		}
	}

	public void trocaComprador() {
		try {
			if (itensSelecionados.length > 0) {
				solicitacao.setItensSolicitacao(Arrays
						.asList(itensSelecionados));
				solicitacao.setComprador(usuario.getComprador());
				this.solicitacaoServico.trocaComprador(solicitacao,
						compradorDestino);
				for (int i = 0; i < solicitacao.getItensSolicitacao().size(); i++) {
					solicitacao
							.getItensSolicitacao()
							.get(i)
							.setObservacao(
									"Alterado para Comprador "
											+ compradorDestino);
				}
				this.solicitacaoServico.insereHistorico(solicitacao,
						"Comprador Alterado");
				FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
						this.solicitacaoServico.getValor("msg_header_sucesso"),
						this.solicitacaoServico
								.getValor("msg_comprador_alterado"));
				FacesContext.getCurrentInstance().addMessage(null, msg);
				buscaSolicitacaoComprador();
				itensSelecionados = null;
			} else {
				FacesMessage msg = new FacesMessage(
						FacesMessage.SEVERITY_ERROR,
						this.solicitacaoServico.getValor("msg_header_erro"),
						this.solicitacaoServico.getValor("msg_erro_item"));
				FacesContext.getCurrentInstance().addMessage(null, msg);
			}
		} catch (Exception e) {
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					this.solicitacaoServico.getValor("msg_header_erro"),
					this.solicitacaoServico
							.getValor("msg_comprador_alterado_erro"));
			FacesContext.getCurrentInstance().addMessage(null, msg);
			e.printStackTrace();
		}
	}

	public void selecionaRejeitados() {
		itensRejeicao = Arrays.asList(itensSelecionados);
		for (int i = 0; i < itensRejeicao.size(); i++) {
			itensRejeicao.get(i).setObservacao("");
		}
	}

	public void atualizaObs(ProdutoBean produto) {
		if (produto == itensRejeicao.get(0)) {
			for (int i = 1; i < itensRejeicao.size(); i++) {
				itensRejeicao.get(i).setObservacao(
						itensRejeicao.get(0).getObservacao());
				RequestContext.getCurrentInstance().addPartialUpdateTarget(
						"formProdRej:tProdRej:" + i + ":obsProd");
			}
		}
	}

	public void buscaCompradores() {
		try {
			this.compradores = compradorServico
					.buscaCompradoresFilial(solicitacao.getFilial());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@SuppressWarnings("rawtypes")
	@Override
	protected IServicoGenerico getServico() {
		return this.pedidoServico;
	}

	public UsuarioBean getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioBean usuario) {
		this.usuario = usuario;
	}

	public PedidoServico<PedidoBean> getPedidoServico() {
		return pedidoServico;
	}

	public void setPedidoServico(PedidoServico<PedidoBean> pedidoServico) {
		this.pedidoServico = pedidoServico;
	}

	public SolicitacaoServico<SolicitacaoBean> getSolicitacaoServico() {
		return solicitacaoServico;
	}

	public void setSolicitacaoServico(
			SolicitacaoServico<SolicitacaoBean> solicitacaoServico) {
		this.solicitacaoServico = solicitacaoServico;
	}

	public List<SolicitacaoBean> getListaSolicitacao() {
		return listaSolicitacao;
	}

	public void setListaSolicitacao(List<SolicitacaoBean> listaSolitacao) {
		this.listaSolicitacao = listaSolitacao;
	}

	public ProdutoDataModel getItensSolicitacao() {
		return itensSolicitacao;
	}

	public void setItensSolicitacao(ProdutoDataModel itensSolicitacao) {
		this.itensSolicitacao = itensSolicitacao;
	}

	public SolicitacaoBean getSolicitacao() {
		return solicitacao;
	}

	public void setSolicitacao(SolicitacaoBean solicitacao) {
		this.solicitacao = solicitacao;
	}

	public EmpresaBean getEmpresa() {
		return empresa;
	}

	public void setEmpresa(EmpresaBean empresa) {
		this.empresa = empresa;
	}

	public String getDataDe() {
		return dataDe;
	}

	public void setDataDe(String dataDe) {
		this.dataDe = dataDe;
	}

	public String getDataAte() {
		return dataAte;
	}

	public void setDataAte(String dataAte) {
		this.dataAte = dataAte;
	}

	public String getNumSolicitacao() {
		return numSolicitacao;
	}

	public void setNumSolicitacao(String numSolicitacao) {
		this.numSolicitacao = numSolicitacao;
	}

	public String getCodProd() {
		return codProd;
	}

	public void setCodProd(String codProd) {
		this.codProd = codProd;
	}

	public String getFilial() {
		return filial;
	}

	public void setFilial(String filial) {
		this.filial = filial;
	}

	public Map<String, String> getParametros() {
		return parametros;
	}

	public void setParametros(Map<String, String> parametros) {
		this.parametros = parametros;
	}

	public ProdutoBean[] getItensSelecionados() {
		return itensSelecionados;
	}

	public void setItensSelecionados(ProdutoBean[] itensSelecionados) {
		this.itensSelecionados = itensSelecionados;
	}

	public List<ProdutoBean> getItensRejeicao() {
		return itensRejeicao;
	}

	public void setItensRejeicao(List<ProdutoBean> itensRejeicao) {
		this.itensRejeicao = itensRejeicao;
	}

	public List<CompradorBean> getCompradores() {
		return compradores;
	}

	public void setCompradores(List<CompradorBean> compradores) {
		this.compradores = compradores;
	}

	public String getCompradorDestino() {
		return compradorDestino;
	}

	public void setCompradorDestino(String compradorDestino) {
		this.compradorDestino = compradorDestino;
	}

	public CompradorServico<CompradorBean> getCompradorServico() {
		return compradorServico;
	}

	public void setCompradorServico(
			CompradorServico<CompradorBean> compradorServico) {
		this.compradorServico = compradorServico;
	}

}
